//: Playground - noun: a place where people can play

import UIKit

//: # swfit 读书笔记

//: ## 继承

//: ### 定义一个基类
class Vehicle {
    var currentSpeed = 0.0
    var description: String {
        return "traveling at \(currentSpeed) miles per hour"
    }
    func makeNoise() {
        // 什么也不做-因为车辆不一定会有噪音
    }
}

//: ### 子类生成
class Bicycle: Vehicle {
    var hasBasket = false
}

//: ### 重写
//: ### 重写方法
class Train: Vehicle {
    override func makeNoise() {
        print("Choo Choo")
    }
}

//: ### 重写属性
//: note 如果你在重写属性中提供了 setter，那么你也一定要提供 getter。如果你不想在重写版本中的 getter 里修改继承来的属性值，你可以直接通过super.someProperty来返回继承来的值，其中someProperty是你要重写的属性的名字。


class Car: Vehicle {
    var gear = 1
    override var description: String {
        return super.description + " in gear \(gear)"
    }
}

//: ### 重写属性观察器
//: ### 不能给常量属性和只读属性重写观察器，并且 setter 方法和属性观察器不能同事存在，因为你重写了 setter 你就能知道是怎么改的值了。
class AutomaticCar: Car {
    override var currentSpeed: Double {
        didSet {
            gear = Int(currentSpeed / 10.0) + 1
        }
    }
}
//: ### 防止重写
//: ### 你可以通过把方法，属性或下标标记为final来防止它们被重写，只需要在声明关键字前加上final修饰符即可（例如：final var，final func，final class func，以及final subscript）
